#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <libexif/exif-data.h>

#define BOLD_GRAY "\033[1;90m"
#define RED "\033[0;31m"
#define WHITE "\033[0;37m"
#define RESET "\033[0m"

int module_11_run(const char *filename) {
    char log_msg[1024];

    // Открываем файл для проверки
    FILE *file = fopen(filename, "rb");
    if (!file) {
        snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "File type not recognized: %s" RESET, strerror(errno));
        printf("%s\n", log_msg);
        return 1;
    }

    // Проверяем сигнатуру JPEG
    unsigned char buffer[2];
    size_t read_bytes = fread(buffer, 1, 2, file);
    fclose(file);
    if (read_bytes != 2 || buffer[0] != 0xFF || buffer[1] != 0xD8) {
        snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "Not a JPEG file" RESET);
        printf("%s\n", log_msg);
        return 1;
    }

    // Загружаем EXIF-данные
    ExifData *ed = exif_data_new_from_file(filename);
    if (!ed) {
        snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " RED "No EXIF data found" RESET);
        printf("%s\n", log_msg);
        return 1;
    }

    // Переменные для хранения EXIF-данных
    char resolution[32] = "Unknown";
    char date_time[32] = "Unknown";
    char camera_model[64] = "Unknown";
    char gps_info[128] = "None"; // Увеличен размер до 128 для длинных строк

    // Извлекаем разрешение
    ExifEntry *entry_x = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_PIXEL_X_DIMENSION);
    ExifEntry *entry_y = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_PIXEL_Y_DIMENSION);
    if (entry_x && entry_y) {
        char x_str[16], y_str[16];
        exif_entry_get_value(entry_x, x_str, sizeof(x_str));
        exif_entry_get_value(entry_y, y_str, sizeof(y_str));
        snprintf(resolution, sizeof(resolution), "%sx%s", x_str, y_str);
    }

    // Извлекаем дату съёмки
    ExifEntry *entry_date = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_DATE_TIME_ORIGINAL);
    if (entry_date) {
        exif_entry_get_value(entry_date, date_time, sizeof(date_time));
    }

    // Извлекаем модель камеры
    ExifEntry *entry_model = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_MODEL);
    if (entry_model) {
        exif_entry_get_value(entry_model, camera_model, sizeof(camera_model));
    }

    // Извлекаем геолокацию
    ExifEntry *entry_lat = exif_content_get_entry(ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LATITUDE);
    ExifEntry *entry_lon = exif_content_get_entry(ed->ifd[EXIF_IFD_GPS], EXIF_TAG_GPS_LONGITUDE);
    if (entry_lat && entry_lon) {
        char lat_str[32], lon_str[32];
        exif_entry_get_value(entry_lat, lat_str, sizeof(lat_str));
        exif_entry_get_value(entry_lon, lon_str, sizeof(lon_str));
        snprintf(gps_info, sizeof(gps_info), "Lat: %s, Lon: %s", lat_str, lon_str);
    }

    // Формируем вывод
    snprintf(log_msg, sizeof(log_msg), BOLD_GRAY " Library libexif: " WHITE "Resolution: %s, Taken: %s, Camera: %s, GPS: %s" RESET,
             resolution, date_time, camera_model, gps_info);
    printf("%s\n", log_msg);

    // Освобождаем ресурсы
    exif_data_unref(ed);
    return 0;
}
